# -*- coding: utf-8 -*-
# @Time    : 2024/2/4 21:51
# @Author  : micah
# @File    : 21.补充-数据库连接池.py
# @Software: PyCharm


"""
为什么要使用数据库连接池:
    1.数据库连接池类似线程池
        在创建数据库连接池对象的过程中, 会在连接池对象内部创建多个链接对象
        在多任务的情况下可以复用连接池中的链接对象

    2.在多任务的情况下, 如果只有一个链接对象去负责多个任务数据的增删改查,
"""

import pymysql
from dbutils.pooled_db import PooledDB


pool = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数，0和None表示无限制连接数
    mincached=2,  # 初始化时，链接池中至少创建的空闲的链接，0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接，0和None不限制
    maxshared=3,  # 链接池中最多共享的链接数量，0和None表示全部共享。PS: 无用，因为pymysql和mysqldb的模块都不支持共享链接
    blocking=True,  # 连接池中如果没有可用链接后，是否阻塞等待。False，不等待直接报错；True，等待直到有可用链接，再返回。
    host='127.0.0.1',
    port=3306,
    user='<username>',
    password='<password>',
    database='<database>',
    charset='utf8'
)


# 1.从链接池中获取一个可用的链接
db = pool.connection()
# 2.从获取的链接中创建游标
cursor = db.cursor()
